package pop3proxy.client;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
import pop3proxy.persistence.Account;
import pop3proxy.persistence.AccountManager;
import pop3proxy.persistence.Mailbox;

/**
 * Diese Klasse repräsentiert den Client und enthält auch sämtliche 
 * Konfigurationsvariablen, die für den Client relevant sind. 
 * Der Client startet in regelmäßigen Abständen MailThreads, welche
 * die Mails für alle Accounts runterladen.
 */
public class Client extends Thread {
    public final static String configFile = "accounts.obj";
    public final static int popInterval = 1000*60*10; //Höchstens alle 10 Minuten einmal prüfen 
    public final static boolean deleteMails = true;  //Für testzwecke sollen die auf dem Server liegenden Mails nicht gelöscht werden
    
    private Mailbox mailbox;
    private AccountManager accountManager;
    private Semaphore quit;
    
    public Client(Mailbox mailbox, Semaphore quit) {
        this.mailbox = mailbox;
        this.quit = quit;
    }
    
    @Override
    public void run() {
        loadConfig();
        new ClientConsoleThread(accountManager, quit).start(); //IO-Thread erzeugen
        
        while (true) {
            try {
                checkMails();
                sleep(popInterval);  
            } catch (InterruptedException ex) { return; }
        }
    }
    
    private void loadConfig() {
        File config = new File(configFile);
        if (config.exists()) {
            FileInputStream reader = null;
            try {
                reader = new FileInputStream(config);
            } catch (FileNotFoundException ex) {} //Kann nicht passieren
            try {
                System.out.println("Lade AccountManager...");
                ObjectInputStream objectReader = new ObjectInputStream(reader);
                accountManager = (AccountManager) objectReader.readObject();
                System.out.println("AccountManager geladen.");
            } catch (IOException | ClassNotFoundException ex) {
                System.err.println("AccountManager konnte nicht aus configdatei geladen werden, erstelle neuen AccountManager");
                System.err.println(ex);
                accountManager = new AccountManager();
            }
        } else { //config.exists()
            System.out.println("Konfigurationsdatei konnte nicht gefunden werden, erstelle neuen AccountManager...");
            accountManager = new AccountManager();
        }
    }

    private void checkMails() throws InterruptedException {
        List<MailThread> threads = new ArrayList<>();
        for(Account account : accountManager) {
            if (account.active) {
                MailThread mailer = new MailThread(account, mailbox);
                threads.add(mailer);
                mailer.start();
            }
        }

        for(MailThread mailer : threads)
            mailer.join();
    }
}
